// time-sampling.js

/**
 * 模拟一个耗时任务
 * 这里使用计算斐波那契数列作为示例
 */
function expensiveTask() {
    const n = 40; // 计算第40个斐波那契数
    let a = 0, b = 1, temp;
    
    for (let i = 2; i <= n; i++) {
        temp = a + b;
        a = b;
        b = temp;
    }
    
    return b;
}

/**
 * 另一个耗时任务示例：数组排序
 */
function sortTask() {
    const arraySize = 100000;
    const arr = [];
    
    // 生成随机数组
    for (let i = 0; i < arraySize; i++) {
        arr.push(Math.floor(Math.random() * 10000));
    }
    
    // 排序
    return arr.sort((a, b) => a - b);
}

/**
 * 使用 performance.now() 进行高精度时间测量
 */
function measureTaskWithPerformance(task, taskName) {
    const startTime = performance.now();
    task();
    const endTime = performance.now();
    
    const duration = endTime - startTime;
    console.log(`${taskName} 耗时: ${duration.toFixed(2)} 毫秒`);
    
    return duration;
}

/**
 * 使用 process.hrtime() 进行高精度时间测量
 */
function measureTaskWithHrtime(task, taskName) {
    const start = process.hrtime();
    task();
    const end = process.hrtime(start);
    
    const durationMs = end[0] * 1000 + end[1] / 1000000;
    console.log(`${taskName} 耗时: ${durationMs.toFixed(2)} 毫秒`);
    
    return durationMs;
}

// 主程序执行
console.log('=== Node.js 耗时任务时间采样分析 ===\n');

// 运行多次采样
const iterations = 5;
const results = [];

console.log(`正在运行 ${iterations} 次采样...\n`);

for (let i = 1; i <= iterations; i++) {
    console.log(`--- 第 ${i} 次运行 ---`);
    
    // 测量斐波那契计算任务
    const fibDuration = measureTaskWithPerformance(expensiveTask, '斐波那契计算');
    
    // 测量排序任务
    const sortDuration = measureTaskWithPerformance(sortTask, '数组排序');
    
    results.push({
        iteration: i,
        fib: fibDuration,
        sort: sortDuration
    });
    
    console.log(''); // 空行分隔
}

// 输出统计分析
console.log('=== 采样结果统计分析 ===\n');

// 计算平均值
const avgFib = results.reduce((sum, r) => sum + r.fib, 0) / results.length;
const avgSort = results.reduce((sum, r) => sum + r.sort, 0) / results.length;

// 计算标准差
function calculateStdDev(values, mean) {
    const squaredDifferences = values.map(value => Math.pow(value - mean, 2));
    const variance = squaredDifferences.reduce((sum, val) => sum + val, 0) / values.length;
    return Math.sqrt(variance);
}

const fibDurations = results.map(r => r.fib);
const sortDurations = results.map(r => r.sort);

const stdDevFib = calculateStdDev(fibDurations, avgFib);
const stdDevSort = calculateStdDev(sortDurations, avgSort);

// 输出统计结果
console.log(`斐波那契计算任务统计:`);
console.log(`  平均耗时: ${avgFib.toFixed(2)} 毫秒`);
console.log(`  标准差: ${stdDevFib.toFixed(2)} 毫秒`);
console.log(`  最小值: ${Math.min(...fibDurations).toFixed(2)} 毫秒`);
console.log(`  最大值: ${Math.max(...fibDurations).toFixed(2)} 毫秒\n`);

console.log(`数组排序任务统计:`);
console.log(`  平均耗时: ${avgSort.toFixed(2)} 毫秒`);
console.log(`  标准差: ${stdDevSort.toFixed(2)} 毫秒`);
console.log(`  最小值: ${Math.min(...sortDurations).toFixed(2)} 毫秒`);
console.log(`  最大值: ${Math.max(...sortDurations).toFixed(2)} 毫秒`);

// 分析结果
console.log('\n=== 结果分析 ===');
console.log('观察发现：');
console.log('1. 同样的耗时任务每次运行的时间并不完全相同');
console.log('2. 差异可能由以下因素造成:');
console.log('   - 操作系统调度和CPU资源分配');
console.log('   - 内存管理(GC)活动');
console.log('   - 其他后台进程的影响');
console.log('   - CPU温度和频率调节');
console.log('   - 缓存命中率差异');
console.log('3. 通常首次运行可能较慢（JIT编译开销）');
console.log('4. 多次运行取平均值能获得更准确的性能评估');